using System;
using DevExpress.Utils;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using MobileLoader.DataSet;

namespace MobileLoader.Controls
{
    public partial class TMNMovementXtraForm : XtraForm
    {
        private Controller _controller;
        private readonly TMNMovimentoDataSet _dataSet = new TMNMovimentoDataSet();
        private bool _loading;

        #region Properties

        public TMNMovimentoDataSet DataSet
        {
            set { _dataSet.Merge(value); }
        }

        public Controller Controller
        {
            set {  _controller = value; }
        }

        #endregion

        public TMNMovementXtraForm()
        {
            InitializeComponent();
            Load += TmnMovementXtraFormLoad;
            anulledLoadsCalcEdit.EditValueChanged += delegate { UpdateBalance(); };
            anulledInvoicesCalcEdit.EditValueChanged += delegate { UpdateBalance(); };
            regularizationCalcEdit.EditValueChanged += delegate { UpdateBalance(); };
            depositsCalcEdit.EditValueChanged += delegate { UpdateDifferencial(); };
            okSimpleButton.Click += OKSimpleButtonClick;
        }

        #region Private Methods

        private void SetupShopLookupData()
        {
            if (_controller == null)
                return;
            tmnLojasDataSet = _controller.GetShopsOfMovements();
            shopLookUpEdit.Properties.Columns.Clear();
            shopLookUpEdit.Properties.Columns.AddRange(new[]
                                                           {
                                                               new LookUpColumnInfo("SAP", "SAP", 85, FormatType.None, "", false, HorzAlignment.Near),
                                                               new LookUpColumnInfo("Nome", "Nome", 85, FormatType.None, "", true, HorzAlignment.Near)
                                                           });
            shopLookUpEdit.Properties.DisplayMember = tmnLojasDataSet.Loja.NomeColumn.ColumnName;
            shopLookUpEdit.Properties.ValueMember = tmnLojasDataSet.Loja.SAPColumn.ColumnName;
            shopLookUpEdit.Properties.DataSource = tmnLojasDataSet.Loja;
        }

        private void SetDataToControls()
        {
            _loading = true;
            shopLookUpEdit.EditValue = _dataSet.Movimento[0].SAPLoja;
            dateEdit.DateTime = _dataSet.Movimento[0].Data;
            billsCalcEdit.EditValue = _dataSet.Movimento[0].Factura;
            anulledInvoicesCalcEdit.EditValue = _dataSet.Movimento[0].AnulacaoFactura;
            loadsCalcEdit.EditValue = _dataSet.Movimento[0].Carregamento;
            anulledLoadsCalcEdit.EditValue = _dataSet.Movimento[0].AnulacaoCarregamento;
            regularizationCalcEdit.EditValue = _dataSet.Movimento[0].Regularizacao;
            balanceCalcEdit.EditValue = _dataSet.Movimento[0].Saldo;
            depositsCalcEdit.EditValue = _dataSet.Movimento[0].Deposito;
            chequeCalcEdit.EditValue = _dataSet.Movimento[0].Cheque;
            differenceCalcEdit.EditValue = _dataSet.Movimento[0].Diferencial;
            remarksMemoEdit.Text = _dataSet.Movimento[0].IsObservacoesNull() ? "" : _dataSet.Movimento[0].Observacoes;
            closedCheckEdit.Checked = _dataSet.Movimento[0].Fechado;
            _loading = false;
        }

        private void LockControls()
        {
            shopLookUpEdit.Enabled = false;
            if (!_dataSet.Movimento[0].Fechado)
                return;
            anulledInvoicesCalcEdit.Enabled = false;
            anulledLoadsCalcEdit.Enabled = false;
            regularizationCalcEdit.Enabled = false;
            depositsCalcEdit.Enabled = false;
            remarksMemoEdit.Enabled = false;
        }

        private void UpdateBalance()
        {
            if (_loading) 
                return;
            _dataSet.Movimento[0].Factura = Convert.ToDouble(billsCalcEdit.EditValue);
            _dataSet.Movimento[0].AnulacaoFactura = Convert.ToDouble(anulledInvoicesCalcEdit.EditValue);
            _dataSet.Movimento[0].Carregamento = Convert.ToDouble(loadsCalcEdit.EditValue);
            _dataSet.Movimento[0].AnulacaoCarregamento = Convert.ToDouble(anulledLoadsCalcEdit.EditValue);
            _dataSet.Movimento[0].Regularizacao = Convert.ToDouble(regularizationCalcEdit.EditValue);
            _dataSet.Movimento[0].Saldo = _dataSet.Movimento[0].Factura + _dataSet.Movimento[0].Carregamento -
                                        _dataSet.Movimento[0].AnulacaoFactura -
                                        _dataSet.Movimento[0].AnulacaoCarregamento + _dataSet.Movimento[0].Regularizacao;
            _dataSet.Movimento[0].Deposito = Convert.ToDouble(depositsCalcEdit.EditValue);
            _dataSet.Movimento[0].Diferencial = _dataSet.Movimento[0].Deposito - _dataSet.Movimento[0].Saldo;
            balanceCalcEdit.EditValue = _dataSet.Movimento[0].Saldo;
            differenceCalcEdit.EditValue = _dataSet.Movimento[0].Diferencial;
        }

        private void UpdateDifferencial()
        {
            if (_loading)
                return;
            _dataSet.Movimento[0].Deposito = Convert.ToDouble(depositsCalcEdit.EditValue);
            _dataSet.Movimento[0].Diferencial = _dataSet.Movimento[0].Deposito - _dataSet.Movimento[0].Saldo;
            differenceCalcEdit.EditValue = _dataSet.Movimento[0].Diferencial;
        }

        private void GetDataFromControls()
        {
            _dataSet.Movimento[0].SAPLoja = Convert.ToInt32(shopLookUpEdit.EditValue);
            _dataSet.Movimento[0].Data = dateEdit.DateTime;
            _dataSet.Movimento[0].Factura = Convert.ToDouble(billsCalcEdit.EditValue);
            _dataSet.Movimento[0].AnulacaoFactura = Convert.ToDouble(anulledInvoicesCalcEdit.EditValue);
            _dataSet.Movimento[0].Carregamento = Convert.ToDouble(loadsCalcEdit.EditValue);
            _dataSet.Movimento[0].AnulacaoCarregamento = Convert.ToDouble(anulledLoadsCalcEdit.EditValue);
            _dataSet.Movimento[0].Regularizacao = Convert.ToDouble(regularizationCalcEdit.EditValue);
            _dataSet.Movimento[0].Saldo = Convert.ToDouble(balanceCalcEdit.EditValue);
            _dataSet.Movimento[0].Deposito = Convert.ToDouble(depositsCalcEdit.EditValue);
            _dataSet.Movimento[0].Diferencial = Convert.ToDouble(differenceCalcEdit.EditValue);
            if (remarksMemoEdit.Text == "")
                _dataSet.Movimento[0].SetObservacoesNull();
            else
                _dataSet.Movimento[0].Observacoes = remarksMemoEdit.Text;
            _dataSet.Movimento[0].Fechado = closedCheckEdit.Checked;
        }

        #endregion

        void TmnMovementXtraFormLoad(object sender, EventArgs e)
        {
            SetupShopLookupData();
            SetDataToControls();
            LockControls();
        }

        void OKSimpleButtonClick(object sender, EventArgs e)
        {
            GetDataFromControls();
            _controller.UpdateTmnMovement(_dataSet);
        }

    }
}